package lu.med.praxiswahl.wahlumed.dao.beans;

import java.util.List;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import lu.med.praxiswahl.wahlumed.dao.beans.daointerface.VersicherungAntraegeDAOInt;
import lu.med.praxiswahl.wahlumed.model.beans.CustomerTBL;
import lu.med.praxiswahl.wahlumed.model.beans.VersicherungAntraegeTBL;

/**
 * Session Bean implementation class VersicherungAntraegeDAO
 */
@Stateless
@Local( { VersicherungAntraegeDAOInt.class })
public class VersicherungAntraegeDAO implements VersicherungAntraegeDAOInt
{

	@PersistenceContext(unitName = "gynaekomedic-ejbPU")
	private EntityManager	em	= null;

	/**
	 * Default constructor.
	 */
	public VersicherungAntraegeDAO()
	{
		
	}

	@Override
	public void delete(Long todo)
	{
		VersicherungAntraegeTBL item = this.retrieveAntragItemByID(todo);

		CustomerTBL cust = item.getCustomer();

		cust.getAntraegeItems().remove(item);

		em.remove(item);
		em.flush();

	}

	@Override
	public Long findDatabaseSubPrimaryKeyIndex()
	{
		try
		{

			Long result = (Long) em.createQuery(
					"select max(CTG_nummer) from VersicherungAntraegeTBL v ")
					.getSingleResult();

			return result.longValue();
		}
		catch (Exception e)
		{
			/*
			 * throw new RuntimeException("OrdonanceTBL is empty", e);
			 */
			return -1l;
		}
	}

	@Override
	public void persist(VersicherungAntraegeTBL todo)
	{
		em.persist(todo);
		em.flush();

	}

	@Override
	public VersicherungAntraegeTBL retrieveAntragItemByID(Long id)
	{
		return em.find(VersicherungAntraegeTBL.class, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<VersicherungAntraegeTBL> retrieveAntragItemsByCustomer(
			String matricule)
	{
		try
		{
			return (List<VersicherungAntraegeTBL>) em.createQuery(
					"select v from VersicherungAntraegeTBL v where v.customer = '"
							+ matricule + "' order by v.datum").getResultList();
		}
		catch (Exception e)
		{
			throw new RuntimeException(
					"Could not retrieve Versicherung Antraege  for this Customer",
					e);
		}
	}

	@Override
	public void update(VersicherungAntraegeTBL todo)
	{
		em.merge(todo);
		em.flush();

	}

}
